package com.yeyks.newwebsocket;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;

import javax.websocket.Session;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Author fuchangshuai
 * @date 2019/4/8 8:33 PM
 */
@Slf4j
public class WebSocketUtils {

    /**
     * 记录连接人数，一个账号只能在一个地方推送，同一个账号登陆会覆盖(key为userId, value为用户session)
     */
    static Map<String, Session> clients = new ConcurrentHashMap<>();

    /**
     * 记录连接人数，一个账号可在多处登陆，每个人都推送(key为userId, value为用户session)
     */
    static Map<String, IdentityHashMap<String, Session>> clientsAll2 = new ConcurrentHashMap<>();

    /**
     * 在线人数
     */
    static int onlineNumber = 0;

    /**
     * 添加用户
     *
     * @param userId
     * @param session
     */
    public static void add(String userId, Session session) {
//        log.info("添加用户前{}，将要添加的用户{}", JSONObject.toJSONString(clientsAll2.keySet()), session.getId());
        clients.put(userId, session);
        IdentityHashMap<String, Session> map = new IdentityHashMap<>();
        map.put(userId, session);
        clientsAll2.put(session.getId(), map);
//        log.info("添加用户前在线用户{}", JSONObject.toJSONString(clientsAll2.keySet()));
        addOnlineNumber();
    }

    /**
     * 移除用户
     *
     * @param userId
     */
    static void remove(String userId, String sessionId) {
//        log.info("移除前在线用户{}，将要移除的用户{}", JSONObject.toJSONString(clientsAll2.keySet()), sessionId);
        clients.remove(userId);
        for (Map.Entry<String, IdentityHashMap<String, Session>> entry : clientsAll2.entrySet()) {
            if (entry.getKey() != null && entry.getKey().equals(sessionId)) {
                clientsAll2.remove(sessionId);
                break;
            }
        }
//        log.info("移除后在线用户{}", JSONObject.toJSONString(clientsAll2.keySet()));
        lessOnlineNumber();
    }

    /**
     * 在线人数+1
     */
    private static void addOnlineNumber() {
        onlineNumber++;
//        log.info("有新连接加入！ 当前在线人数" + onlineNumber);
    }

    /**
     * 在线人数-1
     */
    private static void lessOnlineNumber() {
        onlineNumber--;
//        log.info("有连接关闭！ 当前在线人数" + onlineNumber);
    }
}
